package com.zhangshanfeng.test;

import java.util.ArrayList;
import java.util.stream.Stream;

/*
### Stream流中间操作方法【应用】

- 概念

  中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作

- 常见方法

  | 方法名                                          | 说明                                                       |
  | ----------------------------------------------- | ---------------------------------------------------------- |
  | Stream<T> filter(Predicate predicate)           |
   用于对流中的数据进行过滤                                   |
  | Stream<T> limit(long maxSize)                   |
  返回此流中的元素组成的流，截取前指定参数个数的数据         |
  | Stream<T> skip(long n)                          |
  跳过指定参数个数的数据，返回由该流的剩余元素组成的流       |
  | static <T> Stream<T> concat(Stream a, Stream b) |
  合并a和b两个流为一个流                                     |
  | Stream<T> distinct()                            |
  返回由该流的不同元素（根据Object.equals(Object) ）组成的流 |
 */
public class MyStream03 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三丰");
        list.add("张无忌");
        list.add("张翠山");
        list.add("王二麻子");
        list.add("张良");
        list.add("谢广坤");
        list.add("sdfjosi");
        list.add("sdoujfgoi");
        list.add("puip");

        //filter方法获取流中的 每一个数据.
        //而test方法中的s,就依次表示流中的每一个数据.
        //我们只要在test方法中对s进行判断就可以了.
        //如果判断的结果为true,则当前的数据留下
        //如果判断的结果为false,则当前数据就不要.

        //需求1：取前3个数据在控制台输出
        list.stream().limit(3).forEach(s-> System.out.println(s));
        System.out.println("===================");

        //需求2：跳过3个元素，把剩下的元素在控制台输出
        list.stream().skip(3).forEach(s-> System.out.println(s));
        System.out.println("===========");

        //需求3：跳过2个元素，把剩下的元素中前2个在控制台输出
        list.stream().skip(2).limit(2).forEach(s-> System.out.println(s));
        System.out.println("=================");


        ////需求1：取前4个数据组成一个流
        Stream<String> limit = list.stream().limit(4);
        ////需求2：跳过2个数据组成一个流
        Stream<String> skip = list.stream().skip(2);

        //需求3：合并需求1和需求2得到的流，并把结果在控制台输出
        /*Stream.concat(limit,skip).forEach(s-> System.out.println(s));
        System.out.println("==================");*/


        //需求4：合并需求1和需求2得到的流，并把结果在控制台输出，要求字符串元素不能重复
        //重点已经合并过的就不能，再次合并操作-----否则会报异常
        Stream.concat(limit,skip).distinct().forEach(s-> System.out.println(s));
        System.out.println("============================");




    }
}
